package com.ganbo.service;

import org.redisson.api.RLock;

import java.util.concurrent.TimeUnit;

/**
 * 分布式锁 接口
 *
 * @author jianglongtao
 * @date 2018年8月21日
 */
public interface ILockService {

    /**
     * 使用默认配置参数执行tryLock，默认时间单位为秒。<br/>
     * 时间默认值通过redisson.default.waitTime和redisson.default.leaseTime指定。
     */
    boolean tryLock(String lockKey);

    /**
     * <p>
     * 尝试获取锁，如果锁被占用则等待并不断尝试，如果在waitTime之后仍未获得锁，则返回false；
     * </p>
     * <p>
     * 若获取到锁，返回true，并将锁的最大持有时间设置为leaseTime；如leaseTime到达且锁未被释放，则将强制释放该锁。
     * </p>
     *
     * @param lockKey
     * @param unit
     * @param waitTime
     * @param leaseTime
     * @return
     * @see RLock#tryLock(long waitTime, long leaseTime, TimeUnit
     * unit)
     */
    boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime);

    /**
     * 释放锁
     *
     * @param lockKey 要释放的锁key
     */
    void unlock(String lockKey);

    /**
     * 获取RLock对象，用于扩展自定义操作
     *
     * @param lockKey
     * @return
     */
    RLock getLockObject(String lockKey);

    /**
     * 释放锁
     *
     * @param lock
     */
    void unlock(RLock lock);

}
